const fxp = require('fast-xml-parser');
const fs = require('fs');
// 导入分析模块
const { sortGameList } = require('./getFinalData');
// 导入 生成 xml 模块
const { getUserList, getGameList } = require('./getXmlData');
// 请求模块
const { getData } = require('./getData');
// 时间格式化
const { formatData } = require('./formatDate');
// 日志打印输出
const { log } = require('./util/log');

// 初始化 数据
let userInfo = [];
let gameinfo = [];
let isGetSatrt = false;
let isGetEnd = false;

// 防止多次跳转下一天
let stopJumpNext = 0;

// 暂存 res 输出
let res = {};

let start = '',
  end = '';

// let start = "2020-02-24 02:08:51";
// let end = "2020-02-23 10:32:29" // "2020-02-22 01:36:39";

// getUserListToArray(1, 1);     // 不存在 dataType 更换情况， 故 userDataType 恒等于 1；
// getGameListToArray(1, 1);     // 存在 dataType 更换情况， 当前日期获取完成之后 跳转下一日期 2；

// 递归获取用户列表
async function getUserListToArray(userIndex, userDataType) {
  let xmlBody = getUserList(userIndex, userDataType);
  await getData(xmlBody).then(response => {
    let xml2json = fxp.parse(response.data);
    let finalData = JSON.parse(
      xml2json['soap:Envelope']['soap:Body']['FriendUserInfoSelResponse']['FriendUserInfoSelResult']
    );
    if (finalData.dataList.length) {
      // console.log(finalData.TotalUsersNum, finalData.dataList.length)
      userInfo = [...userInfo, ...finalData.dataList];
      // console.log(userInfo.length)
      // 递归部分
      if (userInfo.length < finalData.TotalUsersNum.split('/')[0]) {
        getUserListToArray(userIndex + 1, userDataType);
      } else {
        log('用户信息获取成功🍎', userInfo.length);
        // fs.writeFile('../datalist/userlist_1.json', JSON.stringify(userInfo));
        // 获取赛事信息
        // console.log(userInfo);
        getGameListToArray(1, 1);
      }
    } else {
      console.error(finalData);
    }
  });
}

// 日期更换标识
// {"TotayCostCardNum":0,"YesterdayCostCardNum":0,"dataList":[],"Retcode":1,"Messagee":"数据获取成功","Content":""}

// 递归获取赛事数据列表
async function getGameListToArray(index, dataType) {
  let xmlBody = getGameList(index, dataType);
  await getData(xmlBody).then(response => {
    let xml2json = fxp.parse(response.data);
    let finalData = JSON.parse(
      xml2json['soap:Envelope']['soap:Body']['FriendRecordRoomGameSelResponse'][
        'FriendRecordRoomGameSelResult'
      ]
    );
    if (finalData.dataList.length) {
      // console.log(finalData.dataList.length)
      // 循环找到指定日期
      for (let i = 0; i < finalData.dataList.length; i++) {
        let item = finalData.dataList[i];
        // 未获取开始位置
        if (!isGetSatrt) {
          // 寻找开始位置；
          if (new Date(item.WriteDate).getTime() <= start) {
            // isGetSatrt 设置为 true
            isGetSatrt = true;
            log('找到开始时间了🍊，数据存储开始', item.WriteDate);
            gameinfo.push(item);
          }
        }
        // 已知开始位置，寻找最终位置
        else {
          // 寻找最终位置；
          if (new Date(item.WriteDate).getTime() <= end) {
            // isGetEnd 设置为 true
            isGetEnd = true;
            log('找到最终时间了🍌，程序结束', item.WriteDate);
            gameinfo.push(item);
            // 结束循环，结束递归
            // 对赛事数据去重
            getClearGameList(gameinfo, res);
            break;
          } else {
            gameinfo.push(item);
          }
        }
        // 🐀递归条件  当前循环执行完毕 且 未到达 终点
        if (i == finalData.dataList.length - 1 && !isGetEnd) {
          getGameListToArray(index + 1, dataType);
        }
      }
    } else {
      stopJumpNext += 1;
      if (stopJumpNext <= 2) {
        log('当前日期获取完毕🌶，准备跳转下一时间段');
        // 时间跳转第二页 递归
        getGameListToArray(1, dataType + 1);
      } else {
        res.send(JSON.stringify({ code: -1 }));
      }
    }
  });
}

// 针对游戏赛事数据 进行 去重
function getClearGameList(gameinfo) {
  let obj = {};
  let isHave = [];
  let clearData = gameinfo.reduce((cur, next) => {
    obj[next.GameNum] ? isHave.push(next) : (obj[next.GameNum] = true && cur.push(next));
    return cur;
  }, []); //设置cur默认类型为数组，并且初始值为空的数组
  log('过滤完成🍎，干净的数据长度为', clearData.length);
  log('重复的数据长度为', isHave.length);
  // 输出 干净数据 重复数据
  let fstart = formatData(start);
  let fend = formatData(end);
  let fileName = `${fstart
    .replace(' ', '_')
    .replace(new RegExp('-', 'gm'), '_')
    .replace(new RegExp(':', 'gm'), '_')}_${fend
    .replace(' ', '_')
    .replace(new RegExp('-', 'gm'), '_')
    .replace(new RegExp(':', 'gm'), '_')}`;
  //  fs.writeFile(`../datalist/${fileName}.json`, JSON.stringify(clearData));
  //  fs.writeFile(`../datalist/_${fileName}.json`, JSON.stringify(isHave));
  log('🍎输出 fileName --', fileName);
  // 执行分析
  sortGameList(userInfo, clearData, fileName, res);
}

// 传递 start end 构造方法
function toSatrt(t1, t2, index, dataType, response) {
  // 初始化数据
  userInfo = [];
  gameinfo = [];
  isGetSatrt = false;
  isGetEnd = false;

  stopJumpNext = 0;

  res = response;
  // 开始
  start = t1;
  end = t2;
  log('\n**********统计开始**********', new Date().toLocaleString());
  log(`🍊获取到post 数据 \n start: ${start} \n end: ${end}`);
  getUserListToArray(index, dataType);
}

exports.toSatrt = toSatrt;
